print("------------------9.1 创建和使用类--------------------")
# 面向对象编程（object-oriented programming，OOP）是最有效的软件编写方法之一。
# 在类中，函数称为方法；而类中的变量称为属性。
# 根据类来创建对象被称为实例化，这让你能够使用类的实例。
# 根据类来创建对象称为实例化，这让你能够使用类的实例

print("------------------9.1.1 创建类--------------------")
# 根据约定，在 Python 中，首字母大写的名称指的是类。
# __init__()是一个特殊方法，每当你根据 Dog 类创建新实例时，Python 都会自动运行它。
# 在这个方法的名称中，开头和末尾各有两个下划线，这是一种约定，
# 旨在避免 Python 默认方法与普通方法发生名称冲突。
# 务必确保 __init__() 的两边都有两个下划线，否则当你使用类来创建实例时，
# 将不会自动调用这个方法，进而引发难以发现的错误。
# __init__() 方法定义成包含三个形参：self、name 和 age。
# 在这个方法的定义中，形参 self 必不可少，而且必须位于其他形参的前面。
#
# 可通过实例访问的变量称为属性（attribute）。
# 以 self 为前缀的变量都可供类中的所有方法使用，
class Dog():
    """一次模拟小狗的简单尝试"""
    def __init__(self, name, age):
        """初始化属性name和age"""
        self.name = name
        self.age = age
    def sit(self):
        """模拟小狗被命令时蹲下"""
        print(self.name.title() + " is now sitting.")
    def roll_over(self):
        """模拟小狗被命令时打滚"""
        print(self.name.title() + " rolled over!")

print("------------------9.1.2 根据类创建实例--------------------")
my_dog = Dog('willie', 6)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")

print("------------------9.1.2 访问属性--------------------")
print(my_dog.name.title())
print(my_dog.age)

print("------------------9.1.2 调用方法--------------------")
my_dog.sit()
my_dog.roll_over()

print("------------------9.1.2 创建多个实例--------------------")

my_dog = Dog('willie', 6)
your_dog = Dog('lucy', 3)

print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
my_dog.sit()

print("\nYour dog's name is " + your_dog.name.title() + ".")
print("Your dog is " + str(your_dog.age) + " years old.")
your_dog.sit()